package org.budo.beetl.tag.render;

import java.io.FileInputStream;
import java.util.Arrays;

import org.beetl.core.ByteWriter;
import org.beetl.core.Template;
import org.beetl.ext.tag.IncludeTag;
import org.budo.beetl.Beetl;
import org.budo.support.lang.util.FileUtil;
import org.budo.support.lang.util.IoUtil;
import org.budo.support.lang.util.StringUtil;

import lombok.extern.slf4j.Slf4j;

/**
 * renderFile("/root/lmw/budo-portal-chameleon/dist/web/www.html","default/page/provider.htm")
 * {}
 * 
 * @author lmw
 */
@Slf4j
public class BudoRenderFileTag extends IncludeTag {
    @Override
    public void render() {
        // 文件方式 第一个
        String arg_a = StringUtil.toString(this.args[1]);
        Boolean exists_a_0 = FileUtil.exists(arg_a);
        if (exists_a_0) {
            this.writeFile(arg_a);
            return;
        }

        // 模板方式 第一个
        String resource_a = this.getRelResourceId();
        boolean exist_a_1 = gt.getResourceLoader().exist(resource_a);

        if (exist_a_1) {
            super.render();
            return;
        }

        // 文件方式 第二个
        String arg_b = StringUtil.toString(this.args[1]);
        Boolean exists_b_0 = FileUtil.exists(arg_b);
        if (exists_b_0) {
            this.writeFile(arg_b);
            return;
        }

        // 模板方式 第二个
        boolean exist_1 = gt.getResourceLoader().exist(arg_b);
        if (exist_1) {
            this.renderTemplate(arg_b);
            return;
        }

        log.error("#59 renderFile error, " + Arrays.toString(this.args));
    }

    private void writeFile(String arg_a) {
        FileInputStream fileInputStream = IoUtil.fileInputStream(arg_a);
        Beetl.write(ctx.byteWriter, fileInputStream);
    }

    private void renderTemplate(String resourceId) {
        Template template = gt.getTemplate(resourceId);

        // 快速复制父模板的变量
        template.binding(this.ctx.globalVar);
        if (ctx.objectKeys != null && ctx.objectKeys.size() != 0) {
            template.dynamic(ctx.objectKeys);
        }

        ByteWriter bw = ctx.byteWriter;
        template.renderTo(bw);
    }
}